エンジニアの知的生産術 プログラミングはどうやって学ぶか
プログラミングはどうやって学ぶか
知的生産術について考えていくうえで、「学び方」について学ぶことは避けられません。しかしこれは抽象的なので、まずはもっと具体的に、プログラミングの学び方について考えてみましょう。私はプログラミングの学びのプロセスは「情報収集・モデル化・検証」の3要素の繰り返しだと考えています。
https://gyazo.com/42ebd9375c1d3ff9ff1bffe69918fad6
図::学びは情報収集・モデル化・検証の繰り返し
まずは具体的に情報収集する
最初の一歩は、具体的に情報収集することです。
プログラミングを学ぶとき、多くの場合、まずほかの人が書いたプログラムを読みます。また読むだけではなく、まねて入力するテクニック「写経」もよく使われています。これが「具体的な情報収集」です。本書でもいくつもの知的生産にまつわる課題とその解決策を紹介します。これはプログラミングのサンプルコードのようなものです。
抽象化してモデルを作る
具体的な情報収集が進んであなたの脳の中に材料がそろってくると、次に「抽象化」が起きます。抽象化は、複数の具体的情報から共通するパターンを見いだすことや、どこが重要でどこが枝葉かを判断することと、強い関連を持っています。
複数のものを見比べ、共通点を見いだすことが、抽象化の助けになります。ここで「Hello, world!と表示するコード」をプログラミング言語Pythonで書いたものを見てみましょう。
code:python: Hello, world! と表示するコード1
print("Hello, world!")
code:出力結果
Hello, world!
Pythonの経験がない人でも、このコードと出力結果とを見比べると、共通部分があることに気付くことでしょう。これがパターンの発見です。
code:python: あなたが見いだしたパターン
print("きっとここに書いたものが表示される")
もし「Bye, world!と出力したい」なら、どこをどう書き換えればよいかわかりますね。つまり、パターンを発見したことで、自分の目的に合わせてプログラムを修正する能力を得たわけです。
次のコードもPythonで書かれた「Hello, world!と表示するコード」ですが、これを初めてPythonを学ぶ人に見せても、修正できるようにはならないでしょう。出力の「Hello, world!」とソースコードの間に共通点を見つけることができないからです(注:勘の良い人ならコード1とコード2を比較して、"".joinから始まる複雑なコードが"Hello, world!"という文字列を作っているのではないかと思うかもしれません。それは正解ですが、本書はPythonの教科書ではないので詳しい解説はしません。)。
code:python: Hello, world! と表示するコード2
print("".join(map(chr, 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33))) この本では、知的生産術を比較することで、みなさんが自分の中に知的生産術のモデルを作ることを手助けしたいと思っています。
実践して検証する
さて、ここまでであなたはパターンを見いだし、「PythonでBye, world!と出力したい場合には、こう書けばよいのではないか?」と思い付く能力を手に入れました。
code:python: あなたが見いだしたパターン
print("きっとここに書いたものが表示される")
code:python: 「Bye, world!」と出力するだろうと思われるコード
print("Bye, world!")
しかし、これはあくまで仮説です。本当にその方法で「Bye, world!と出力する」という目的が達成できるかは、実際に試してみなければわかりません。試してみると、この具体例に関しては、目的が達成できることがわかります。
では複数行に分けて「Hello,(改行)world!」と出力したい場合はどうでしょう? 仮説が正しいなら、こう書けばよいはずです。
code:python: 「Hello,(改行)world!」と出力するだろうと思われるコード
print("Hello,
world!")
試してみると、このコードは構文エラーになり、期待どおりに動かないことがわかります。これは失敗ではありません。「この方法ではうまくいかない」という具体的情報を発見したのです。これは学びのチャンスです。「どうして思ったように動かないのか?」──こう考えることで、あなたは理解を深めていくことができます。
https://gyazo.com/2c0a945150a3de486b822e725d3d5a6d
この例では「改行をprintしたいとき、単に改行したのではうまくいかない」という事実を発見しました。次は、この課題の解決方法を探します。たとえば検索エンジンなどで探す(注:具体的には、Google検索で"Python 改行 print"と検索するなどです。)と、役に立ちそうな情報を含んだサンプルコードが見つかるでしょう。そのサンプルコードは、あなたの「Hello,(改行)world!」を出力するという目的を達成する方法を直接教えてくれるわけではありません。きっと何か別のものを表示するコードでしょう。しかし、この新しいサンプルコードを、今までにあなたが集めた情報と比較すれば、あなたはパターンを見いだし、「なるほど、じゃあこう実装すれば目的が達成できるはずだ」という新しい仮説を生み出すことができるでしょう。
具体的に情報収集し、比較してパターンを発見し、実践して検証し、期待と現実のギャップを発見して、また情報収集をしました。このサイクルを繰り返すことで、あなたはプログラミング能力を学ぶことができます。サイクルを繰り返すことで、新しいプログラムを生み出す力が鍛えられるわけです。知的生産術の学び方も同じです。具体的な情報収集、比較してパターン発見、実践して検証を繰り返すことで学んでいくのです。